package com.zd.template;

import freemarker.core.ParseException;
import freemarker.template.*;

import java.io.*;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;

/**
 * 1. 通过word先画好模板（格式、内容）
 * 2. 导出为xml格式
 * 3. 然后把需要填充的部分修改成${xxx}的变量形式
 * 4. 准备参数变量及对应的值，图片需要转为base编码后的字符串
 * 5. 使用freemarker的进行模板语法的填充
 *
 */
public class FreemarkerWord {
    public static void main(String[] args) {
        try {
            InputStream in = new FileInputStream("D:\\a.png");
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            //建一个空的字节数组
            byte[] result = null;
            byte[] buf = new byte[1024];
            //用来定义一个准备接收图片总长度的局部变量
            int len;
            //将流的内容读取到buf内存中
            while ((len = in.read(buf)) > 0) {
                //将buf内存中的内容从0开始到总长度输出出去
                outputStream.write(buf, 0, len);
            }
            //将out中的流内容拷贝到一开始定义的字节数组中
            result = outputStream.toByteArray();
            //通过util包中的Base64类对字节数组进行base64编码
            String base64 = Base64.getEncoder().encodeToString(result);
            Map<String, String> dataMap = new HashMap<String, String>();
            dataMap.put("img", base64);
            dataMap.put("userName", "张三");
            dataMap.put("today", "2023-04-25");
            Configuration configuration = new Configuration();
            configuration.setDefaultEncoding("utf-8");
            //指定模板路径的第二种方式,我的路径是D:/      还有其他方式
            configuration.setDirectoryForTemplateLoading(new File("C:\\Users\\dongz\\Desktop"));

            // 输出文档路径及名称
            File outFile = new File("C:\\Users\\dongz\\Desktop\\test.doc");
            //以utf-8的编码读取ftl文件
            Template t = configuration.getTemplate("demo.xml", "utf-8");
            Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8"), 10240);
            t.process(dataMap, out);
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
